gusucode.com > VC++ 窗体实现多国家语音切换程序-源码程序 > VC++ 窗体实现多国家语音切换程序-源码程序/code/MultiLanguage.cpp

    // MultiLanguage.cpp : Defines the class behaviors for the application.
// Download by http://www.NewXing.com

#include "stdafx.h"
#include "MultiLanguage.h"
#include "MultiLanguageDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMultiLanguageApp

BEGIN_MESSAGE_MAP(CMultiLanguageApp, CWinApp)
	//{{AFX_MSG_MAP(CMultiLanguageApp)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG
	ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMultiLanguageApp construction

CMultiLanguageApp::CMultiLanguageApp()
{
	// TODO: add construction code here,
	// Place all significant initialization in InitInstance
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CMultiLanguageApp object

CMultiLanguageApp theApp;


CString g_szLanguagePath;	//保存语言文件的路径
CString g_szSettingPath;	//保存设置的文件路径
CString	g_szCurPath;		//保存当前路径

BOOL CMultiLanguageApp::InitInstance()
{
	//获取当前路径
	CString szCurPath("");
	GetModuleFileName(NULL,szCurPath.GetBuffer(MAX_PATH),MAX_PATH);	
	szCurPath.ReleaseBuffer();
	g_szCurPath = szCurPath.Left(szCurPath.ReverseFind('\\') + 1);

	//设置文件在当前路径下 
	g_szSettingPath = g_szCurPath + "setting.ini";
	CFileFind find;
	if(!find.FindFile(g_szSettingPath)) MakeResource(IDR_SETTING,g_szSettingPath);
	find.Close();

	//装入语言
	LoadLanguage();

	CMultiLanguageDlg dlg;
	m_pMainWnd = &dlg;
	dlg.DoModal();

	return FALSE;
}


/*********************************************************************
 * 函数名称:g_LoadString
 * 说明:	根据标识 szID到选定的语言文件中加载字符串
 * 作者:	Geng 
*********************************************************************/
CString g_LoadString(CString szID)
{
	CString szValue;
	DWORD dwSize = 1000;
	GetPrivateProfileString("String",szID,"Not found",
		szValue.GetBuffer(dwSize),dwSize,g_szLanguagePath);
	szValue.ReleaseBuffer();

	szValue.Replace("\\n","\n");	//替换回换行符号

	return szValue;
}

/*********************************************************************
 * 函数名称:g_SetDialogStrings(CDialog *pDlg,UINT uDlgID)
 * 说明:	当对话框运行时获取其所有可得到的字符串,并保存到语言文件中
			每个控件用对话框ID和控件ID唯一标识

 * 入口参数:
 * CDialog *pDlg -- 对话框的指针
 *  UINT uDlgID -- 该对话框的ID
 * 作者: Geng 
*********************************************************************/
void g_SetDialogStrings(CDialog *pDlg,UINT uDlgID)
{
	CString szSection = "String";
	CString szKey,szText;
	bool bSetText = 1;	//1:从文件读,设置对话框
						//0:从对话框读,保存到文件

	if(bSetText)	//1:从文件读,设置对话框
	{
		CString szDefault = "";
		DWORD dwSize = 1000;
		char* pData = (char*)malloc(dwSize);

		//读对话框标题
		szKey.Format("IDD%d_Title",uDlgID);
		if(GetPrivateProfileString(szSection,szKey,szDefault,
				pData,dwSize,g_szLanguagePath) != 0)
		{
			pDlg->SetWindowText(pData);
		}

		//写入各个子控件的标题文字
		CWnd* pWnd = pDlg->GetWindow(GW_CHILD);
		while(pWnd != NULL)
		{
			szKey.Format("IDD%d_%d",uDlgID,pWnd->GetDlgCtrlID());
			if(GetPrivateProfileString(szSection,szKey,szDefault,
					pData,dwSize,g_szLanguagePath) != 0)
			{
				pWnd->SetWindowText(pData);
			}

			pWnd = pWnd->GetWindow(GW_HWNDNEXT);
		}

		//释放内存
		free(pData);
	}
	else	//0:从对话框读,保存到文件
	{
		//写入对话框标题
		szKey.Format("IDD%d_Title",uDlgID);
		pDlg->GetWindowText(szText);
		WritePrivateProfileString(szSection,szKey,szText,g_szLanguagePath);

		//写入各个子控件的标题文字
		CWnd* pWnd = pDlg->GetWindow(GW_CHILD);
		while(pWnd != NULL)
		{
			szKey.Format("IDD%d_%d",uDlgID,pWnd->GetDlgCtrlID());
			pWnd->GetWindowText(szText);
			WritePrivateProfileString(szSection,szKey,szText,g_szLanguagePath);

			pWnd = pWnd->GetWindow(GW_HWNDNEXT);
		}
	}
}

/*********************************************************************
 * 函数名称:CMultiLanguageApp::LoadLanguage
 * 说明:	装入或者设置语言 如果 szLangSel为空则装入语言,否则设置语言
 * 作者: Geng 
*********************************************************************/
void CMultiLanguageApp::LoadLanguage(CString szLangSel /*= ""*/)
{
	//查找语言
	CString szSection = "Setting";
	CString szKey = "Language",szLang;
	DWORD dwSize = 1000;
	
	if(!szLangSel.IsEmpty())	//保存语言
	{
		szLang = szLangSel;
	}
	else	//读取语言设置
	{
		//获取设置的语言
		GetPrivateProfileString(szSection,szKey,"English",szLang.GetBuffer(dwSize),dwSize,g_szSettingPath);
		szLang.ReleaseBuffer();
	}
	
	//查找是否存在
	CFileFind find;
	bool bRet = find.FindFile(g_szCurPath + "Language\\*.ini");
	bool bFound = false;
	CString szEng = "";
	while(bRet)
	{
		bRet = find.FindNextFile();
		if(find.IsDots() || find.IsDirectory()) continue;

		CString szValue;
		CString szFilePath = find.GetFilePath();
		if(GetPrivateProfileString(szSection,szKey,"",szValue.GetBuffer(dwSize),
			dwSize,szFilePath) != 0)
		{
			szValue.ReleaseBuffer();
			if(szValue == szLang)
			{
				g_szLanguagePath = szFilePath;
				bFound = true;
				break;
			}
		}
	}
	find.Close();

	//未找到设定的语言
	if(!bFound)
	{
		int nLangID[2] = {IDR_LANG_ENG,IDR_LANG_CH};
		CString szFileName[2] = {"\\Multi_eng.ini","\\Multi_ch.ini"};
		CString szPath = g_szCurPath + "Language";
		CreateDirectory(szPath,NULL);
		for(int i = 0;i < 2;i++)
		{
			MakeResource(nLangID[i],szPath + szFileName[i]);
		}
		//默认使用英文
		g_szLanguagePath = szPath + szFileName[0];
		szLang = "English";
	}

	//保存语言设置
	WritePrivateProfileString(szSection,szKey,szLang,g_szSettingPath);
}

/*********************************************************************
 * 函数名称:CMultiLanguageApp::MakeResource
 * 说明:	如果未找到所需的资源文件(如设置文件,语言文件等),从程序中产生
 * 作者: Geng 
*********************************************************************/
bool CMultiLanguageApp::MakeResource(int nID, CString szPathName)
{
	HRSRC hSrc = FindResource(NULL,MAKEINTRESOURCE(nID),_T("OWNER_DATA"));
	if(hSrc == NULL)	return false;

	HGLOBAL hGlobal = LoadResource(NULL,hSrc);
	if(hGlobal == NULL)	return false;
	
	LPVOID lp = LockResource(hGlobal);
	DWORD dwSize = SizeofResource(NULL,hSrc);

	CFile file;
	if(file.Open(szPathName,CFile::modeCreate|CFile::modeWrite))
	{
		file.Write(lp,dwSize);
		file.Close();
	}
	FreeResource(hGlobal);

	return true;
}